package com.test.generator;

import com.xingluo.generator.GeneratorUtils;
import com.xingluo.generator.config.CodeStrategy;
import com.xingluo.generator.config.GeneratorConfig;
import com.xingluo.generator.config.TableStrategy;

import java.util.Arrays;

public class CodeAutoGenerator {

    public static void generateCode(GeneratorConfig config) {
        // 设置生成代码的子模块，以及包
        config.packageName("com.generator").fileOverride(true).xml(true).parma(true).vo(true);

        // 基础配置
        config.author("qiuyongjuan")                        // 设置作者
                .module("")                  // 设置maven子模块
                .packageName("com.test.generator")      // 设置包名
                .fileOverride(true)                     // 覆盖已有文件
                .springdoc(true)                        // 启用Swagger3文档
                .controller(true)                       // 生成Controller
                .service(true)                          // 生成Service
                .entity(true)                           // 生成Entity
                .mapper(true)                           // 生成Mapper
                .xml(false)                              // 生成XML
                .parma(false)                            // 生成Param
                .vo(false)                               // 生成VO
                .api(false)                              // 生成API
                .vue(false);                             // 生成Vue

        // 代码策略配置，是否添加导出Excel接口、导入Excel接口，修改状态接口，排序名称
        CodeStrategy codeStrategy = new CodeStrategy()
                .saToken(true)                      // 启用Sa-Token权限，为每个controller添加权限注解
                .sortName("sort")                   // 排序名称，表中有该排序名的字段，则Service实现类中添加排序字段的排序条件
                .resourceNames(Arrays.asList("face", "avatar", "face_url", "ui_url")) // 资源字段名列表，表中有该资源名中的字段，则Service实现类中修改以及删除操作，则会进行资源的修改删除
                .statusName("status")               // 状态名称，表中有该状态名的字段，则生成状态操作的接口
                .enumDict(false)                     // 生成字典枚举
                .enumDicts(i -> i
                        .addEnumDict("product_status", "商品状态", map -> map
                                .dictData("已上架", "0")
                                .dictData("已下架", "1")
                        )
                )
                .vueStatusEnums(i -> i
                        .addPageStatusEnum("product", "status", "product_status")
                )
                .vueForeignKeys(i -> i
                        .addPageForeignKeys("product", builder -> builder
                                .foreignKey("factory_id", "factory", "id", "name", "工厂列表")
                                .foreignKey("category_id", "product_category", "id", "name")
                                .foreignKey("brand_id", "brand", "id", "brand_name")
                        )
                );
        config.codeStrategy(codeStrategy);
        // 创建生成工具
        GeneratorUtils generatorUtils = new GeneratorUtils(config);
        // 生成所有表的代码
        // generatorUtils.generateCode();
        // 生成指定表的代码
         generatorUtils.generateCode("sys_ui");
        // 生成所有以'xl_'打头的表的代码
        // generatorUtils.generateCodeStartWith("xl_");
        // 生成所有不以'sys_'打头的表的代码
        // generatorUtils.generateCodeExcludeStartWith("sys_");
    }

    public static void generateTable(GeneratorConfig config) {
        // 设置生成哪些系统表
        config.tableStrategy(new TableStrategy()
//                .userPermTable(true)
//                .dataScopeTable(true)
//                .configTable(true)
//                .dictTable(true)
//                .logTable(true)
//                .jobTable(true)
                .uiTable(true)
        );
        GeneratorUtils generatorUtils = new GeneratorUtils(config);
        // 创建表
        generatorUtils.generateTable();
    }

    public static void main(String[] args) {
        // 自动代码生成全局配置信息
        GeneratorConfig config = new GeneratorConfig("jdbc:mysql://127.0.0.1:3306/xingluo-test", "root", "123456");
        // 生成代码
         generateCode(config);
        // 生成系统表
//        generateTable(config);
    }
}
